跳到主要内容

BM54 三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

使用双指针去解决这题,一个值不变,其它两处根据三值的合不断的左右移动指针

这题的关键在于两处去重

package main

import "sort"

/**
*
* @param num int整型一维数组
* @return int整型二维数组
*/
func threeSum( num []int ) [][]int {
if len(num) < 3 {
return nil
}

sort.Ints(num)
var result [][]int
n := len(num)
for i := 0; i < n-2; i++ {
if (num[i]>0){
break //如果当前数字大于0,则三数之和一定大于0
}

if i>0 && num[i] == num[i-1]{
continue //去重
}

// 双指针优化
l,r := i + 1, n - 1
for l < r {
tmp := num[l] + num[r] + num[i]
if tmp > 0 {
r--
} else if tmp < 0 {
l++
} else {
result = append(result, []int{num[l], num[r], num[i]})
// 头部去重(如果后面一个数跟当前的数字相等,则代表有重复的结果生成,跳过
for (l < r && num[l] == num[l+1]){
l++
}
r--
l++
}
}
}

return result
}